package upload

import (
	"cloud-storage/lib"
	"errors"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"go.uber.org/zap"
	"io/ioutil"
	"mime/multipart"
	"path"
)

// UploadOss 上传文件到阿里云oss
func UploadOss(file *multipart.FileHeader, fileHash string) {
	//获取文件后缀
	fileSuffix := path.Ext(file.Filename)
	bucket, err := NewBucket()
	if err != nil {
		zap.L().Error("function NewBucket() failed", zap.Any("err", err.Error()))
		return
	}
	// 读取本地文件。
	f, openError := file.Open()
	if openError != nil {
		zap.L().Error("function file.Open() Failed", zap.Any("err", openError.Error()))
		return
		//return "", "", errors.New("function file.Open() Failed, err:" + openError.Error())
	}
	defer f.Close() // 创建文件 defer 关闭
	// 上传阿里云路径 文件名格式 自己可以改 建议保证唯一性
	// yunFileTmpPath := filepath.Join("uploads", time.Now().Format("2006-01-02")) + "/" + file.Filename
	//yunFileTmpPath := global.GVA_CONFIG.AliyunOSS.BasePath + "/" + "uploads" + "/" + time.Now().Format("2006-01-02") + "/" + file.Filename
	yunFileTmpPath := lib.OssSetting.BasePath + fileHash + fileSuffix
	// 上传文件流。
	err = bucket.PutObject(yunFileTmpPath, f)
	if err != nil {
		zap.L().Error("function formUploader.Put() Failed", zap.Any("err", err.Error()))
		return
		//return "", "", errors.New("function formUploader.Put() Failed, err:" + err.Error())
	}
	//return global.GVA_CONFIG.AliyunOSS.BucketUrl + "/" + yunFileTmpPath, yunFileTmpPath, nil

}

// DeleteFile 删除文件
func DeleteFile(key string) error {
	bucket, err := NewBucket()
	if err != nil {
		zap.L().Error("function NewBucket() failed", zap.Any("err", err.Error()))
		return errors.New("function NewBucket() failed err:" + err.Error())
	}

	// 删除单个文件。objectName表示删除OSS文件时需要指定包含文件后缀在内的完整路径，例如abc/efg/123.jpg。
	// 如需删除文件夹，请将objectName设置为对应的文件夹名称。如果文件夹非空，则需要将文件夹下的所有object删除后才能删除该文件夹。
	err = bucket.DeleteObject(key)
	if err != nil {
		zap.L().Error("function bucketManager.Delete() Filed", zap.Any("err", err.Error()))
		return errors.New("function bucketManager.Delete() Filed, err:" + err.Error())
	}

	return nil
}

// DownloadOss 从oss上下载文件
func DownloadOss(fileHash, fileType string) ([]byte, error) {
	bucket, err := NewBucket()
	if err != nil {
		zap.L().Error("function NewBucket() failed", zap.Any("err", err.Error()))
		return nil, errors.New("function NewBucket() failed err:" + err.Error())
	}
	//下载文件到流
	body, err := bucket.GetObject(lib.OssSetting.BasePath + fileHash + fileType)
	if err != nil {
		zap.L().Error("function bucket.GetObject() failed", zap.Any("err", err.Error()))
		return nil, errors.New("function  bucket.GetObject() failed err:" + err.Error())
	}
	defer body.Close()
	//读取数据
	data, err := ioutil.ReadAll(body)
	if err != nil {
		zap.L().Error("function ioutil.ReadAll() failed", zap.Any("err", err.Error()))
		return nil, errors.New("function  ioutil.ReadAll() failed err:" + err.Error())
	}
	return data, nil
}

func NewBucket() (*oss.Bucket, error) {
	//创建OSSClient实例
	client, err := oss.New(lib.OssSetting.EndPoint, lib.SmsCodeSetting.AccessKeyId, lib.SmsCodeSetting.AccessKeySecret)
	if err != nil {
		return nil, err
	}
	//获取储存空间
	bucket, err := client.Bucket(lib.OssSetting.BucketName)
	if err != nil {
		return nil, err
	}
	return bucket, nil
}
